package reseau;

import robot.io.IORobot;


/**
 * Class ReseauNeuronal
 */
public class ReseauNeuronal {

  //
  // Fields
  //

  private int nb_entrées;
  private int nb_sorties;
  private int nb_couche_cache;
  private int nb_neurones_cc;
  
  //
  // Constructors
  //
  /**
   * 
   */
  public ReseauNeuronal(int nb_entrées, int nb_sorties, int nb_couche_cache,
			int nb_neurones_cc) {
		super();
		this.nb_entrées = nb_entrées;
		this.nb_sorties = nb_sorties;
		this.nb_couche_cache = nb_couche_cache;
		this.nb_neurones_cc = nb_neurones_cc;
	}

  
  //
  // Methods
  //


  //
  // Accessor methods
  //

  /**
   * Set the value of nb_entrées
   * @param newVar the new value of nb_entrées
   */
  @SuppressWarnings("unused")
private void setNb_entrées ( int newVar ) {
    nb_entrées = newVar;
  }

/**
   * Get the value of nb_entrées
   * @return the value of nb_entrées
   */
  @SuppressWarnings("unused")
  private int getNb_entrées ( ) {
    return nb_entrées;
  }

  /**
   * Set the value of nb_sorties
   * @param newVar the new value of nb_sorties
   */
  @SuppressWarnings("unused")
  private void setNb_sorties ( int newVar ) {
    nb_sorties = newVar;
  }

  /**
   * Get the value of nb_sorties
   * @return the value of nb_sorties
   */
  @SuppressWarnings("unused")
  private int getNb_sorties ( ) {
    return nb_sorties;
  }

  /**
   * Set the value of nb_couche_cache
   * @param newVar the new value of nb_couche_cache
   */
  @SuppressWarnings("unused")
  private void setNb_couche_cache ( int newVar ) {
    nb_couche_cache = newVar;
  }

  /**
   * Get the value of nb_couche_cache
   * @return the value of nb_couche_cache
   */
  @SuppressWarnings("unused")
  private int getNb_couche_cache ( ) {
    return nb_couche_cache;
  }

  /**
   * Set the value of nb_neurones_cc
   * @param newVar the new value of nb_neurones_cc
   */
  @SuppressWarnings("unused")
  private void setNb_neurones_cc ( int newVar ) {
    nb_neurones_cc = newVar;
  }

  /**
   * Get the value of nb_neurones_cc
   * @return the value of nb_neurones_cc
   */
  @SuppressWarnings("unused")
  private int getNb_neurones_cc ( ) {
    return nb_neurones_cc;
  }

  //
  // Other methods
  //

  /**
   * Calcul des sorties
   * @param        matricePoids Matrices des poids
   * @param        listeEntrees Liste des entrée du robot
   * @param        listeSorties Liste des sorties
   */
  public void calcul( double[][] matricePoids, 
		  IORobot[] listeEntrees, 
		  IORobot[] listeSorties,
		  double[] valeurs_neurones ) {
	  
		//Recopie des valeurs des entrées
		for( int i=0; i<listeEntrees.length; ++i ) {
			valeurs_neurones[i] =  listeEntrees[i].getValeur() ;
		}
	  
		//System.out.println( "Calcul du Réseau : " );
		
	  //Calcul des nouvelles valeurs des neuronnes
		for( int neurone=0; neurone<matricePoids.length; ++neurone ) {
			//System.out.println( "\tCalcul du neuronne : " + neurone );
			double nouvelle_valeur = 0 ;
			
			for( int e=0; e<matricePoids[neurone].length; ++e ) {
				//System.out.println( "\t\tNeuronne " + e + "\t:\t" + matricePoids[neurone][e] + " * " + valeurs_neurones[e]  );
				
				nouvelle_valeur += matricePoids[neurone][e] * valeurs_neurones[e] ;
			}
			//System.out.println( "\tRésultat : " + nouvelle_valeur + ", " + Math.tanh( nouvelle_valeur ) );
			valeurs_neurones[neurone] = Math.tanh( nouvelle_valeur ) ;
			
		}
		
		
		//Recopie des valeurs des entrées
		/*for( int i=0; i<listeEntrees.length; ++i ) {
			listeEntrees[i].setValeur( valeurs_neurones[i] );
		}*/
		
		//Recopie des valeurs des sorties
		int deb_sortie = matricePoids.length - listeSorties.length ;
		for( int i=0; i<listeSorties.length; ++i ) {
			listeSorties[i].setValeur( valeurs_neurones[deb_sortie + i] );
			System.out.print( "\nSortie = " + valeurs_neurones[deb_sortie + i] );
		}
	  
  }


}
